This document is a narrative of explorations of the Kaiser dataset, prior to the final paper.

Note: the data file 31118130.csv is a symlink to the original file in the “../3 + 4” directory in this repository.

raw_data <- read_csv("31118130.csv")

── Column specification ────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_character(),
  end_state1 = col_double(),
  acarot = col_number(),
  endq1 = col_double(),
  q2rot = col_logical(),
  endq2 = col_double(),
  endq10 = col_double(),
  q17rot = col_number(),
  endq22 = col_double(),
  partyrot = col_number(),
  length = col_double(),
  reprostat = col_logical(),
  qctr = col_double(),
  xctr = col_double(),
  wt1 = col_double(),
  weight = col_double(),
  standwt = col_double(),
  weight_ssrs = col_double(),
  cdc2013 = col_double()
)
ℹ Use `spec()` for the full column specifications.
raw_data

Opening question: among survey respondents who respond “refuse to answer” to the question of whom they voted for for president, is there a detectable bias? Are liberals or conservatives, Biden or Trump or “other” voters, more likely to do this? Is there a way we can tell?

We can’t know for sure, but the question is, can we make a data-supported argument, based on the data in this survey, that supports or rejects this idea?

First, let’s get a breakdown of the responses to the question “In the election for U.S. president, did you vote for (Donald Trump) or (Joe Biden), or someone else?”

table(raw_data$voted2)

  Don't know Donald Trump    Joe Biden      Refused Someone else 
           9          417          733          111           32 
# hat tip to https://stackoverflow.com/a/45386128/13603796
table(raw_data$voted2) %>% 
  prop.table() %>% 
  `*`(100) %>% 
  round(2)

  Don't know Donald Trump    Joe Biden      Refused Someone else 
        0.69        32.03        56.30         8.53         2.46 

So 8.5% of respondents refused to answer the question. That’s a significant amount, 1 in 12.

First, how do they lean politically? There are many possible variables we could look at; let’s start with ideology, a response to the question “Would you say your views in most political matters are liberal, moderate, or conservative?”

table(raw_data$ideology)

Conservative   Don't Know      Liberal     Moderate      Refused 
         527           68          424          617           40 

Let’s start to break this down.

ideology_by_refused_voted2 <- raw_data %>%
  select(ideology, voted2) %>%
  filter(voted2 == "Refused")
table(ideology_by_refused_voted2$ideology)

Conservative   Don't Know      Liberal     Moderate      Refused 
          38            6           16           37           14 

Among those who did answer, it looks like a fairly pronounced conservative tilt for people who refuse to answer. Let’s get a visual:

ideology_by_refused_voted2 %>% 
#  ggplot(aes(x=ideology) ) +
  ggplot(aes(x=reorder(ideology,ideology,function(x)-length(x))
# Color doesn't add to this plot, the colors don't mean anything
# and there's no reason to hard-code categories
#             ,fill=ideology
  )) +
  geom_bar(show.legend = FALSE) +
  labs(title = "\"Refused to answer: voted2\" by ideology",
       x = "")

We could invest time in prettying this up more, but it’s just a first glance. Self-identified “Conservative” and “Moderate” respondents both refused to answer the voted2 question by a more than two-to-one rate over “Liberal” respondents, with a slightly smaller number also refusing to answer this question, and a few “Don’t Know” responses.

Let’s get a heatmap of ideology and voted, just for the exercise. Then look at the x-tabs and run a chi-squared test.

freq_ideology_by_voted2 <- raw_data %>%
  count(ideology, voted2)

raw_data %>%
  ggplot(mapping=aes(x = ideology, fill=voted2)) +
  geom_bar() +
  scale_fill_hue()


freq_ideology_by_voted2 %>%
  ggplot(mapping=aes(x = ideology, y=voted2)) +
  geom_tile(mapping = aes(fill=n))

Make some new data frames with cleaned up versions of voted2 and q5 with “I don’t know” removed.

cleaned_voted2 <- raw_data %>%
  select(voted2, q5) %>%
  filter(!is.na(voted2) & !is.na(q5)) %>%
  filter(q5 != "Don't know" & voted2 != "Don't know" & q5 != "Refused")
cleaned_voted2 %>%
  count(q5, voted2) %>%
  ggplot(mapping=aes(x = voted2, y=q5)) +
    geom_tile(mapping = aes(fill=n))

LS0tCnRpdGxlOiAiRmluYWwtZXhwbG9yYXRpb25zIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKYGBge3IgdGlkeXZlcnNlLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgpUaGlzIGRvY3VtZW50IGlzIGEgbmFycmF0aXZlIG9mIGV4cGxvcmF0aW9ucyBvZiB0aGUgS2Fpc2VyIGRhdGFzZXQsIHByaW9yIHRvIHRoZSBmaW5hbCBwYXBlci4KCk5vdGU6IHRoZSBkYXRhIGZpbGUgYDMxMTE4MTMwLmNzdmAgaXMgYSBzeW1saW5rIHRvIHRoZSBvcmlnaW5hbCBmaWxlIGluIHRoZSAiLi4vMyArIDQiIGRpcmVjdG9yeSBpbiB0aGlzIHJlcG9zaXRvcnkuIAoKYGBge3IgbG9hZCByYXdfZGF0YX0KcmF3X2RhdGEgPC0gcmVhZF9jc3YoIjMxMTE4MTMwLmNzdiIpCnJhd19kYXRhCmBgYApPcGVuaW5nIHF1ZXN0aW9uOiBhbW9uZyBzdXJ2ZXkgcmVzcG9uZGVudHMgd2hvIHJlc3BvbmQgInJlZnVzZSB0byBhbnN3ZXIiIHRvIHRoZSBxdWVzdGlvbiBvZiB3aG9tIHRoZXkgdm90ZWQgZm9yIGZvciBwcmVzaWRlbnQsIGlzIHRoZXJlIGEgZGV0ZWN0YWJsZSBiaWFzPyBBcmUgbGliZXJhbHMgb3IgY29uc2VydmF0aXZlcywgQmlkZW4gb3IgVHJ1bXAgb3IgIm90aGVyIiB2b3RlcnMsIG1vcmUgbGlrZWx5IHRvIGRvIHRoaXM/IElzIHRoZXJlIGEgd2F5IHdlIGNhbiB0ZWxsPwoKV2UgY2FuJ3Qga25vdyBmb3Igc3VyZSwgYnV0IHRoZSBxdWVzdGlvbiBpcywgY2FuIHdlIG1ha2UgYSBkYXRhLXN1cHBvcnRlZCBhcmd1bWVudCwgYmFzZWQgb24gdGhlIGRhdGEgaW4gdGhpcyBzdXJ2ZXksIHRoYXQgc3VwcG9ydHMgb3IgcmVqZWN0cyB0aGlzIGlkZWE/CgpGaXJzdCwgbGV0J3MgZ2V0IGEgYnJlYWtkb3duIG9mIHRoZSByZXNwb25zZXMgdG8gdGhlIHF1ZXN0aW9uICJJbiB0aGUgZWxlY3Rpb24gZm9yIFUuUy4gcHJlc2lkZW50LCBkaWQgeW91IHZvdGUgZm9yIChEb25hbGQgVHJ1bXApIG9yIChKb2UgQmlkZW4pLCBvciBzb21lb25lIGVsc2U/IgoKYGBge3J9CnRhYmxlKHJhd19kYXRhJHZvdGVkMikKIyBoYXQgdGlwIHRvIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NTM4NjEyOC8xMzYwMzc5Ngp0YWJsZShyYXdfZGF0YSR2b3RlZDIpICU+JSAKICBwcm9wLnRhYmxlKCkgJT4lIAogIGAqYCgxMDApICU+JSAKICByb3VuZCgyKQpgYGAKU28gOC41JSBvZiByZXNwb25kZW50cyByZWZ1c2VkIHRvIGFuc3dlciB0aGUgcXVlc3Rpb24uIFRoYXQncyBhIHNpZ25pZmljYW50IGFtb3VudCwgMSBpbiAxMi4KCkZpcnN0LCBob3cgZG8gdGhleSBsZWFuIHBvbGl0aWNhbGx5PyBUaGVyZSBhcmUgbWFueSBwb3NzaWJsZSB2YXJpYWJsZXMgd2UgY291bGQgbG9vayBhdDsgbGV0J3Mgc3RhcnQgd2l0aCBgaWRlb2xvZ3lgLCBhIHJlc3BvbnNlIHRvIHRoZSBxdWVzdGlvbiAiV291bGQgeW91IHNheSB5b3VyIHZpZXdzIGluIG1vc3QgcG9saXRpY2FsIG1hdHRlcnMgYXJlIGxpYmVyYWwsIG1vZGVyYXRlLCBvciBjb25zZXJ2YXRpdmU/IgoKYGBge3J9CnRhYmxlKHJhd19kYXRhJGlkZW9sb2d5KQpgYGAKCkxldCdzIHN0YXJ0IHRvIGJyZWFrIHRoaXMgZG93bi4gCgpgYGB7cn0KaWRlb2xvZ3lfYnlfcmVmdXNlZF92b3RlZDIgPC0gcmF3X2RhdGEgJT4lCiAgc2VsZWN0KGlkZW9sb2d5LCB2b3RlZDIpICU+JQogIGZpbHRlcih2b3RlZDIgPT0gIlJlZnVzZWQiKQp0YWJsZShpZGVvbG9neV9ieV9yZWZ1c2VkX3ZvdGVkMiRpZGVvbG9neSkKYGBgCkFtb25nIHRob3NlIHdobyBkaWQgYW5zd2VyLCBpdCBsb29rcyBsaWtlIGEgZmFpcmx5IHByb25vdW5jZWQgY29uc2VydmF0aXZlIHRpbHQgZm9yIHBlb3BsZSB3aG8gcmVmdXNlIHRvIGFuc3dlci4gTGV0J3MgZ2V0IGEgdmlzdWFsOgoKYGBge3J9CmlkZW9sb2d5X2J5X3JlZnVzZWRfdm90ZWQyICU+JSAKIyAgZ2dwbG90KGFlcyh4PWlkZW9sb2d5KSApICsKICBnZ3Bsb3QoYWVzKHg9cmVvcmRlcihpZGVvbG9neSxpZGVvbG9neSxmdW5jdGlvbih4KS1sZW5ndGgoeCkpCiMgQ29sb3IgZG9lc24ndCBhZGQgdG8gdGhpcyBwbG90LCB0aGUgY29sb3JzIGRvbid0IG1lYW4gYW55dGhpbmcKIyBhbmQgdGhlcmUncyBubyByZWFzb24gdG8gaGFyZC1jb2RlIGNhdGVnb3JpZXMKIyAgICAgICAgICAgICAsZmlsbD1pZGVvbG9neQogICkpICsKICBnZW9tX2JhcihzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh0aXRsZSA9ICJcIlJlZnVzZWQgdG8gYW5zd2VyOiB2b3RlZDJcIiBieSBpZGVvbG9neSIsCiAgICAgICB4ID0gIiIpCmBgYApXZSBjb3VsZCBpbnZlc3QgdGltZSBpbiBwcmV0dHlpbmcgdGhpcyB1cCBtb3JlLCBidXQgaXQncyBqdXN0IGEgZmlyc3QgZ2xhbmNlLiBTZWxmLWlkZW50aWZpZWQgIkNvbnNlcnZhdGl2ZSIgYW5kICJNb2RlcmF0ZSIgcmVzcG9uZGVudHMgYm90aCByZWZ1c2VkIHRvIGFuc3dlciB0aGUgYHZvdGVkMmAgcXVlc3Rpb24gYnkgYSBtb3JlIHRoYW4gdHdvLXRvLW9uZSByYXRlIG92ZXIgIkxpYmVyYWwiIHJlc3BvbmRlbnRzLCB3aXRoIGEgc2xpZ2h0bHkgc21hbGxlciBudW1iZXIgYWxzbyByZWZ1c2luZyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5kIGEgZmV3ICJEb24ndCBLbm93IiByZXNwb25zZXMuCgpMZXQncyBnZXQgYSBoZWF0bWFwIG9mIGlkZW9sb2d5IGFuZCB2b3RlZCwganVzdCBmb3IgdGhlIGV4ZXJjaXNlLiBUaGVuIGxvb2sgYXQgdGhlIHgtdGFicyBhbmQgcnVuIGEgY2hpLXNxdWFyZWQgdGVzdC4KCmBgYHtyfQpmcmVxX2lkZW9sb2d5X2J5X3ZvdGVkMiA8LSByYXdfZGF0YSAlPiUKICBjb3VudChpZGVvbG9neSwgdm90ZWQyKQoKcmF3X2RhdGEgJT4lCiAgZ2dwbG90KG1hcHBpbmc9YWVzKHggPSBpZGVvbG9neSwgZmlsbD12b3RlZDIpKSArCiAgZ2VvbV9iYXIoKSArCiAgc2NhbGVfZmlsbF9odWUoKQoKZnJlcV9pZGVvbG9neV9ieV92b3RlZDIgJT4lCiAgZ2dwbG90KG1hcHBpbmc9YWVzKHggPSBpZGVvbG9neSwgeT12b3RlZDIpKSArCiAgZ2VvbV90aWxlKG1hcHBpbmcgPSBhZXMoZmlsbD1uKSkKYGBgCgpNYWtlIHNvbWUgbmV3IGRhdGEgZnJhbWVzIHdpdGggY2xlYW5lZCB1cCB2ZXJzaW9ucyBvZiB2b3RlZDIgYW5kIHE1IHdpdGggIkkgZG9uJ3Qga25vdyIgcmVtb3ZlZC4KCmBgYHtyfQpjbGVhbmVkX3ZvdGVkMiA8LSByYXdfZGF0YSAlPiUKICBzZWxlY3Qodm90ZWQyLCBxNSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh2b3RlZDIpICYgIWlzLm5hKHE1KSkgJT4lCiAgZmlsdGVyKHE1ICE9ICJEb24ndCBrbm93IiAmIHZvdGVkMiAhPSAiRG9uJ3Qga25vdyIgJiBxNSAhPSAiUmVmdXNlZCIpCmBgYAoKYGBge3J9CmNsZWFuZWRfdm90ZWQyICU+JQogIGNvdW50KHE1LCB2b3RlZDIpICU+JQogIGdncGxvdChtYXBwaW5nPWFlcyh4ID0gdm90ZWQyLCB5PXE1KSkgKwogICAgZ2VvbV90aWxlKG1hcHBpbmcgPSBhZXMoZmlsbD1uKSkKCmBgYAoK